<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let obj = {
            name: 'Alvin'
        }

        let name = 'window'
        function fn() {
            console.log(this.name);
        }
     
        //给Function的原型属性新增一个_call方法
        Function.prototype._call = function (obj, ...params) {
            
            //1. 如果obj是undefined或null，应该让obj指向window
            obj == null ? obj = window : null;
            //2. 如果obj不是一个对象，需要转成对象
            if (typeof obj !== 'function' && typeof obj !== 'object') {
                obj = Object(obj);
            }
            //3.给obj添加一个唯一值属性，避免与原有属性冲突
            let objKey = Symbol();
            //给obj添加一个唯一值属性objKobjKey并赋值为调用函数
            obj[objKey] = this;''
            //4.调用函数fn并接收返回值
            let result = obj[objKey](...params);
            //5.删除给obj新增的临时属性
            delete obj[objKey];
            //6.将函数fn的执行结果返回
            return result;
        }
        fn();//window
        fn._call(obj);//Alivn
    </script>
</body>

</html>